from flask import Flask, redirect, request, session
import requests
import secrets
import logging
import sys
import json


# 配置日志记录器
logging.basicConfig(
    level=logging.DEBUG,
    # format="%(asctime)s - %(levelname)s - %(name)s(%(funcName)s#%(lineno)d)' - %(message)s",
    format="%(asctime)s.%(msecs)03d %(levelname)s %(process)d --- [%(threadName)s] %(name)s[%(funcName)s#%(lineno)d]: %(message)s",
    datefmt="%Y-%m-%d %H:%m:%S",
    handlers=[
        logging.FileHandler("gitee_login.log", encoding="utf-8"),  # 将日志记录到文件
        logging.StreamHandler(),  # 同时在控制台输出日志
    ],
)
# 获取当前模块名作为日志记录器名称
# logger_name = __name__.split(".")[-1]
# 获取脚本文件名（包含路径）
script_file_name = sys.argv[0]
# 获取文件名（去除路径部分）
module_name = script_file_name.split("/")[-1].split("\\")[-1].rstrip(".py")
# logger_name = __class__.__name__
logger = logging.getLogger(module_name)

app = Flask(__name__)
app.secret_key = secrets.token_hex(16)  # 设置用于加密会话的密钥

# 替换为你在Gitee申请应用时得到的Client ID
client_id = "YOUR_CLIENT_ID"
# 替换为你在Gitee申请应用时得到的Client Secret
client_secret = "YOUR_CLIENT_SECRET"
# 替换为你在Gitee申请应用时设置的回调地址（redirect_uri）
redirect_uri = "YOUR_REDIRECT_URI"
redirect_uri = "http://localhost:5000/callback"


@app.route("/gitee_login")
def gitee_login():
    # 构建Gitee授权页面的链接
    authorize_url = f"https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=user_info"
    # authorize_url = f"https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code"
    logger.debug(f"构建授权链接: {authorize_url}")
    return redirect(authorize_url)


@app.route("/callback")
def callback():
    # 获取Gitee返回的授权码
    code = request.args.get("code")
    logger.debug(f"接收授权码: {code}，来源请求函数: {request.method} {request.url}")
    if code:
        # 使用授权码换取访问令牌
        token_url = f"https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&client_secret={client_secret}&redirect_uri={redirect_uri}"
        logger.debug(f"发起换取令牌请求: {token_url}")
        response = requests.post(token_url)
        logger.debug(
            f"换取令牌请求状态码: {response.status_code}，响应内容: {response.text}"
        )
        access_token = response.json().get("access_token")
        logger.debug(f"获取访问令牌: {access_token}")
        if access_token:
            # 使用访问令牌获取用户信息
            userinfo_url = f"https://gitee.com/api/v5/user?access_token={access_token}"
            logger.debug(f"发起获取用户信息请求: {userinfo_url}")
            userinfo_response = requests.get(userinfo_url)
            logger.debug(
                f"获取用户信息请求状态码: {userinfo_response.status_code}，响应内容: {userinfo_response.text}"
            )
            user_info = userinfo_response.json()
            json.dump(user_info, open("user_info.json", "w", encoding="utf-8"))
            logger.debug(f"获取用户信息: {user_info}")
            # 在这里可以进行本地系统的用户登录或注册相关逻辑处理
            # 例如判断用户是否已存在，若不存在则创建新用户等
            # 简单示例，将用户信息存入会话（实际应用中应妥善保存到数据库等）
            session["user_info"] = user_info
            return "登录成功，欢迎使用本系统！"
    return "登录失败，请重试"


logger.debug("程序执行完毕")

if __name__ == "__main__":
    app.run(debug=True, port=5000)
